;:open4,4
;:sys36864
	;.opt p4
	*= $c000	;startadresse 49152
;
; multitask 49152
; nikolaus heusler
; XXXXXXXXXXXX  XX
; XXXX XXXXXXXX XX
; 5.91
;
; konstanten
;
tab	=$e000	;tabelle der startadressen
taba	=tab+64	;speicher fuer akkumulator
tabx	=taba+32	;speicher fuer x-register
taby	=tabx+32	;speicher fuer y-register
tabs	=taby+32	;speicher fuer prozessorstatus
tabp	=tabs+32	;speicher fuer stackpointer
stackt	=$e100	;zwischenspeicher fuer stack
t	=2	;temporaer
u	=t+1	;temporaer
;
; sprungtabelle
;
	jmp set	;einschalten
	jmp off	;abschalten
	jmp speed	;geschwindigkeit setzen
;
; programm
;
; parameteruebergabe
;
set	sei	;irq sperren
	lda #0
	ldy #>tab
	sta t
	sty u	;zeiger auf tabelle
	sta bas	;flag fuer basic loeschen
	sta anz	;anzahl loeschen
	sta first	;abbruchflag loeschen
getpar	jsr 121	;noch ein zeichen holen
	beq end	;keine zeichen, ende
	cmp #","	;komma testen
	beq komma	;ja, dann ok
	jmp $af08	;sonst syntax error
komma	jsr $aefd	;komma holen
	jsr 121	;chrgot
	cmp #"&"	;und-symbol testen
	beq basic	;ja, dann basic-programm
	jsr $ad8a	;sonst adresse holen
	jsr $b7f7	;und in high/low umrechnen
	ldy #0
	lda $14	;adresse low
	ora $15	;adresse high
	beq ill	;beide null, dann fehler
	lda $14	;low
	sta (t),y	;merken
	inc t
	lda $15	;high
	sta (t),y	;speichern
	inc t
	inc anz	;anzahl erhoehen
	lda anz
	cmp #31	;schon 31
	bcs ill	;ja, dann fehler
	bcc getpar	;nein, dann weitermachen
basic	jsr 115
	inc bas	;basic-flag setzen
	bne getpar	;und weitermachen
;
; vektoren setzen, taskwechsel starten
;
end	lda #0	;ende-flag
	tay	;index
	sta (t),y
	iny
	sta (t),y	;tab-ende merken
	lda anz	;anzahl testen
	beq ill	;null, dann fehler
	sei
	lda #<formirq
	ldy #>formirq
	sta $314
	sty $315	;neuen irq-vektor setzen
	lda #<formnmi
	ldy #>formnmi
	sta $fffa
	sty $fffb	;neuen nmi-vektor setzen
	lda #0	;wechselflag
	sta t	;loeschen
	cli	;irq wieder zulassen
baswart	lda bas	;basic-flag
	beq baswart	;nein, dann endlosschleife
	rts	;sonst fertig und auch basic bearbeiten
;
; fehlerbehandlung
;
ill	jmp $b248	;illegal quantity error
;
; routine abschalten
;
off	sei
	jsr 65418	;vektoren korrigieren
	cli
	rts	;fertig
;
; geschwindigkeit einstellen
;
speed	jsr 121	;parameter
	beq norm	;nein, dann norm
	jsr $b7f1	;wert holen
	.byt $2c	;skip
norm	ldx #60	;default-geschwindigkeit
	stx 56325	;irq-speed
	rts
;
; task fertig (rts-befehl)
;
dahin	jmp dahin	;endlosschleife, falls task fertig
dort	=dahin-1	;einsprungadresse
;
; neue irq-routine
;
formirq	lda 1	;konfiguration
	sta jk+1	;merken
	lda #48
	sta 1	;ram einblenden
formlp	ldy #0
	lda (t),y	;tabelle lesen
	iny
	ora (t),y
	bne weiter
	sty first	;beide null, dann tab-ende
	dey
	sty t
	beq formlp	;tabelle auf anf.
weiter	dey	;gibt 0
	lda (t),y	;adresse low lesen
	sta jl+1	;und merken
	iny
	lda (t),y	;adresse high
	sta jh+1	;merken
; adresse des aufrufenden programms mit adresse
; des naechsten tasks vertauschen
	tsx	;stackpointer
	lda $105,x	;stack lesen
	ldy #0	;als index
	sta (t),y	;wert abspeichern
	iny
	lda $106,x	;startadresse high
	sta (t),y
	lda t
	lsr	;mal 2
	tay	;tabellenzeiger
	lda taba,y
	sta ja+1	;akkumulator
	lda tabx,y
	sta jx+1	;x-register
	lda taby,y
	sta jy+1	;y-register
	lda tabs,y
	sta js+1	;status
	lda tabp,y
	sta jp+1	;stackpointer
	lda $101,x
	sta taby,y	;alten y-wert vom stack
	lda $102,x
	sta tabx,y	;alten x-wert vom stack
	lda $103,x
	sta taba,y	;alten a-wert vom stack
	lda $104,x
	sta tabs,y	;alten s-wert vom stack
	txa
	sta tabp,y	;stackpointer merken
	lda t
	sta jt+1
	clc
	adc #>stackt
	sta u	;stacktabelle
	ldy #0
	sty t	;index
dupst	lda (t),y	;stack
	sta jr+1	;in tabelle speichern
	lda $100,y
	sta (t),y
jr	lda #0	;selbstmodifikation
	sta $100,y
	iny
	bne dupst
jt	lda #0
	sta t
	lsr
	tay
	inc t
	inc t
	lda #>tab
	sta u
jp	ldx #0	;selbstmodifikation
	txs	;stackpointer
	lda first
	bne jh
	ldx #247	;standard-wert
	txs	;als stackpointer
	lda #>dort
	sta $108,x
	lda #<dort	;task in endlosschleife
	sta $107,x	;abbrechen
jh	lda #0	;adresse high
	sta $106,x	;selbstmodifikation
jl	lda #0	;adresse low
	sta $105,x	;auf stack
js	lda #0	;status
	sta $104,x	;auf stack
ja	lda #0	;akkumulator
	sta $103,x	;auf stack
jx	lda #0	;x-register
	sta $102,x	;auf stack
jy	lda #0	;y-register
	sta $101,x	;auf stack
jk	lda #0	;konfiguration
	sta 1	;setzen
	jmp $ea31	;weiter im irq
;
; neuer hardware-nmi
;
formnmi	lda #55	;neuen nmi
	sta 1	;sicherheitshalber
	jmp ($fffa)	;normalen nmi
;
; variablen
;
bas	brk	;flag basic-programm
anz	brk	;anzahl der tasks
first	brk	;task-abbruch-flag
